TACO 应用开发入门
一、前言
1.1 TACO SDK 简介
TACO SDK 是特普斯微面向 EA65 系列 AI SoC 定制的软件开发包,为深度学习应用开发和部署提供了高效、易用的解决方案。
其主要功能模块包括:
- 深度学习工具链: 用于移植和优化神经网络模型。
- 软件开发接口库: 提供网络模型在板载 NPU 上进行推理所需的核心 API。
- 媒体开发库: 包含拉流推流、音视频编解码、视频处理等功能的库及示例代码。
1.2 TACO AI 开发框架简介
TACO AI 开发框架包括核心推理引擎 taRuntime、taOpenCV、taFFmpeg、taCV、taOpenBLAS、NN 工具链等,其基本架构如下图所示:
1.3 SDK 获取
TACO SDK 需要配合特普斯微官方发布的 EM20-DK (或 EA65 系列其他产品如 AIBOX)使用,本文例程以 EM20-DK 开发板为基准。
- 获取 TACO SDK
二、开发环境搭建
本章节指导用户在主机上搭建交叉编译板载应用软件的SDK开发环境及板端运行环境的配置。
2.1 主机环境配置 (Docker)
用户需要一台 x86 主机来安装 SDK 和配置开发环境。我们强烈建议使用 Docker 来保证编译环境的一致性,简化环境配置过程。
- 硬件推荐
- 若主要用于模型编译、量化等任务,推荐内存 >= 8GB。
- 若主要用于交叉编译应用,主流 PC 即可满足要求。
- 操作系统
- Ubuntu 20.04 或更高版本。
主机环境配置步骤如下:
-
安装依赖工具
打开终端,执行以下命令安装 Git, Docker 等必要工具。
sudo apt-get update
sudo apt install -y git git-lfs docker.io wget unzip parted fdisk util-linux e2fsprogs dosfstools -
获取 TACO SDK
-
启动 Docker 编译环境
进入解压后的
tps-future目录,执行start_workshop_docker.sh脚本来启动并进入预配置好的 Docker 容器。./start_workshop_docker.sh成功后,用户将进入 Docker 容器的
tps-future目录,后续的编译操作都将在此环境中进行。
2.2 开发板环境配置
-
登录开发板
EM20-DK 开发板上电后,通过串口(波特率
115200)或 SSH 登录(用户名/密码:root/root)。 -
安装板载业务包
EM20-DK 开发板默认是最小系统,需确认已安装
taco-sdk业务包以创建SDK应用运行环境、获取最新的库和驱动。sudo apt update
sudo apt install tps-firmware taco-sdk -
验证驱动加载
执行
lsmod命令,确保vipcore驱动已成功加载,如下所示:root@taco-dk:~# lsmod
Module Size Used by
vipcore 352256 0 -
验证版本信息
为了确保开发环境与文档一致,避免因版本错乱导致未知问题,请在开发板上执行以下命令查看 SDK 环境版本信息:
tps-smi输出:
Fri Jul 31 10:45:57 2026
+-----------------------------------------------------------------------------+
| TPS SMI: 1.7.0 Firmware Version: 1.7.0 TACO Version: 2.0.0 |
+---------------------------------------+-------------------------------------+
| NPU-SOM SoC-Name |CPU-CurClk CPU-Usage Mem-Usage | SOM-Current SOM-Pwr |
|Fan ChipTemp SOM-Temp |NPU-Usage0 NPU-Usage1 NPU-Clk | SOM-SN |
+---------------------------------------+-------------------------------------+
| - TOPSFuture EA6530|1584MHz 0% 29% | 90mA 0mW |
|1495 27°C 26°C| 0% 0% N/A | EM04CSC1A1 |
+---------------------------------------+-------------------------------------+请核对输出的版本号,确保其符合用户项目所要求的版本。
三、AI 应用示例
3.1 Hello, TACO:运行第一个 AI 应用
本章节将以官方示例 mot(Multiple Object Tracking) 为例,带用户走通 PC 编译 -> 板载运行 -> 结果呈现 的完整开发闭环。
3.1.1 编译示例程序 (在 Docker 中)
请确保用户已根据 「TACO 应用开发入门」文档的「主机环境配置」章节 的指引进入了 Docker 容器的 bash 终端。
-
进入示例代码目录
cd /tps-future/ta-vsp/ta-samples/mot -
创建并进入 build 目录
cd simple_demo
mkdir build && cd build -
使用 cmake 配置工程
cmake .. && make
编译成功后,可执行文件 simple_demo 会生成在 simple_demo/build/ 目录下。
3.1.2 部署与运行 (在开发板上)
-
拷贝文件 用户可以使用
scp命令来完成以下操作。-
将主机 Docker 容器内的可执行文件 (示例程序路径为
/tps-future/ta-vsp/ta-samples/mot/simple_demo/build/) 复制到开发板的任意位置(例如/root)。 -
将
config.json(示例程序路径为/tps-future/ta-vsp/ta-samples/mot/configs/config.json) 文件复制到开发板的任意位置(例如/root)。 -
将模型文件 (示例程序路径为
/tps-future/ta-vsp/ta-samples/mot/models/) 复制到开发板的任意位置(例如/root)。 -
用户可以将自己的视频文件复制到开发板的任意位置(例如
/root)。
💡 提示:
- 模型文件路径和数据文件路径,请根据实际情况修改,和
config.json保持一致即可。 - 在
config.json中可以配置使用ffmpeg或者opencv进行视频处理。
-
-
运行程序
在开发板的终端中,进入用户拷贝的
build目录,并运行程序。
# 运行程序,以本地视频文件为例
./simple_demo ./config.json💡 提示:
- 不带参数运行
./simple_demo将会显示用法说明。
- 不带参数运行
3.1.3 查看结果 (视频文件)
程序成功运行后,会按照 config.json 中 output_path 配置生成推理结果视频。
若配置 "output_path": "output.mp4",则输出文件为 output.mp4,文件内包含 AI 目标检测标注,可将该视频文件拷贝至主机进行播放查看效果。
3.1.4 退出程序
程序一旦运行,视频帧未全部解码完成时只能通过强制关闭,来实现退出程序的效果。
-
强制关闭
📝 注意:
- 用户可以手动执行 CTRL + C ,强制关闭此程序。
- 关闭过程中出现
[error] Error sending a packet for decoding这种错误提示,属于正常行为,可以忽略。
-
程序打印
📝 注意:
- 运行过程中,程序可能会存在错误打印,可能是执行了硬件不支持的功能(如图像放大操作),失败后会自动使用CPU实现。
3.2 应用案例讲解:mot(Multiple Object Tracking)
本节将基于 mot 案例,解析其内部实现,帮助用户理解 TACO 应用开发的核心流程。
3.2.1 程序流程概览
该示例整合了 TACO SDK 的主要模块,实现了一个完整的 AI 处理链路:
3.2.2 核心 API 解析
以下是实现上述流程的关键代码片段和 API 解析。
3.2.2.1 加载模型
使用 ta_runtime_load_model_from_file 函数从 .nb 文件加载预编译的 AI 模型到 NPU。
// 最后一个参数 0 表示使用 NPU 的第一个核心
int status = ta_runtime_load_model_from_file(&m_nnrt_context, file_path.c_str(), 0);
3.2.2.2 硬件加速解码
通过 avcodec_find_decoder_by_name 指定使用硬件加速解码器 (h264_taco 或 hevc_taco)。
if (video_stream->codecpar->codec_id == AV_CODEC_ID_H264) {
codec = avcodec_find_decoder_by_name("h264_taco");
}
if (video_stream->codecpar->codec_id == AV_CODEC_ID_HEVC) {
codec = avcodec_find_decoder_by_name("hevc_taco");
}
3.2.2.3 图像尺寸调整 (Resize)
调用 ta_cv_image_resize 接口,使用硬件对解码后的图像进行高效缩放,以满足模型输入尺寸要求。
ta_cv_resize_image_t resize_attr = {0};
ta_cv_resize_t resize = {0};
resize.in_height = srch; // 源图高度
resize.in_width = srcw; // 源图宽度
resize.out_height = dsth; // 目标高度
resize.out_width = dstw; // 目标宽度
// ... 其他参数设置
resize_attr.resize_img_attr = &resize;
ret = ta_cv_image_resize(&resize_attr, image_in, image_out);
3.2.2.4 NPU 推理
通过 ta_runtime_set_input_pha 设置模型输入数据的物理地址,然后调用 ta_runtime_run_network 触发 NPU 进行一次推理。
taconn_input_phy_t input[2];
// 设置 NV12 格式图像的 Y 和 UV 分量的物理地址和大小
input[0].physical_table[0] = phyaddr;
input[0].size_table[0] = srcw * srch;
input[1].physical_table[0] = phyaddr + srcw * srch;
input[1].size_table[0] = srcw * srch / 2;
// 设置输入并运行推理
ret = ta_runtime_set_input_pha(&m_nnrt_context, m_input_num, input);
ret = ta_runtime_run_network(&m_nnrt_context);
3.2.2.5 后处理
对 NPU 输出的原始数据进行解析,获取目标的类别、置信度和坐标,并进行坐标转换。
objects[i] = proposals[picked[i]];
// 获取检测目标的原始坐标
float x0 = objects[i].box.left;
float y0 = objects[i].box.top;
// ...
// 对坐标进行缩放和边界处理
x0 = std::max(std::min(x0, (float)letterbox_cols), 0.f);
y0 = std::max(std::min(y0, (float)letterbox_rows), 0.f);
// ...
// 更新检测目标的最终坐标
objects[i].box.left = x0;
// objects[i].class_id; // 获取检测类别
// objects[i].prob; // 获取置信度
3.2.2.6 硬件编码
将带有标注框的图像, 通过 avcodec_find_encoder_by_name 指定使用硬件加速解码器 (jpeg_taco ), 进行硬件 JPEG 编码,准备用于推流。
mjpeg_codec = avcodec_find_encoder_by_name("jpeg_taco");
TACO SDK 的主要模块详情请查阅 「TACO 应用开发技术手册」 中的相关内容。
四、多媒体应用示例
在 PC 端打开下载镜像中的 ta-workshop-xxx 文件夹中的 tps-future 文件,执行 ./start_workshop_docker.sh 进入docker镜像中进行编译。
以 mot 为例:
- 进入
simple_demo代码目录
cd /tps-future/ta-vsp/ta-samples/mot/simple_demo
- 创建并进入
build目录
mkdir build && cd build
- 使用
cmake配置工程
cmake .. && make
以上示例均在 Docker 开发环境中编译,并将生成的可执行程序通过 scp 拷贝到目标板运行。
4.1 AVFrame 到 OpenCV Mat 转换示例 (avframe_to_mat)
taOpenCV 图像处理 sample 集合,演示 taOpenCV 库的各项功能。在执行 sample 前,请先确认各项输入参数是否正确。另外 /data 目录下存放了测试数据,可以自行替换测试数据。
演示如何将 FFmpeg 解码得到的 AVFrame 转换为 OpenCV 的 cv::Mat 格式。
输入说明:
- H264/HEVC 视频:使用
h264_taco/hevc_taco硬件解码为 NV12
由 AVFrame 构造的 Mat 对象获取 AVFrame 数据,并存储为二进制文件。
taopencv_sample_avframe_to_mat <input_file>
| 参数 | 说明 |
|---|---|
| input_file | 输入视频流(MP4) |
./taopencv_sample_avframe_to_mat output.mp4
4.2 Tacv 图像拷贝示例 (copy_to)
展示如何将图像数据拷贝到另一张图像的指定位置。
输入说明:
- JPEG 图片:使用
ta_cv_image_jpeg_dec硬件解码为 NV12 - H264/HEVC 视频:使用
h264_taco/hevc_taco硬件解码为 NV12
tacv_sample_copy_to <input_file> dst_w dst_h crop_to_stx crop_to_sty <output_file>
| 参数 | 说明 |
|---|---|
| input_file | 输入图片或视频文件 |
| dst_w / dst_h | 目标画布尺寸 |
| crop_to_stx / crop_to_sty | 复制起始坐标 |
| output_file | 输出 JPEG 文件路径 |
./tacv_sample_copy_to output.mp4 1280 720 100 50 copy_to_out.jpg
4.3 视频解码示例 (decode)
- 在 docker 中,进入
decode目录,输入make开始编译,即可获得板端可执行程序decoder_sample:
cd ta-vsp/ta-samples/decode
mkdir build && cd build
cmake .. && make
- 通过
scp命令将程序发送到板端的/usr/data/vdec目录下:
scp -r decoder_sample root@192.168.56.171:/usr/data/vdec # IP 地址按照实际情况更改
- 登录到板端的
/usr/data/vdec目录,目录下有一个视频文件input.mp4,它用于测试解码功能:
./decoder_sample -i input.mp4 -c h264
解码器会输出如下日志,表明解码成功并显示性能:
[h264_taco @ 0x3e200] codec = H264, width:640, height:640
2026-04-22 10:54:16 [INFO][taffmpeg] Decoding completed successfully
2026-04-22 10:54:16 [INFO][taffmpeg] Resolution: 640x640, Output format: nv12
2026-04-22 10:54:16 [INFO][taffmpeg] Decoding performance: 941.18 fps
-
解码完成后,会在当前目录下生成
result.yuv文件,它包含一组分辨率为640x640的NV12视频帧。 -
将
result.yuv拷回主机,用ffmpeg提供的ffplay工具进行播放,观察图像正确性。播放命令为:
ffplay -video_size 640x640 -pixel_format nv12 -i result.yuv
4.4 视频编码示例 (encode)
- 在 docker 中,进入
encode目录,输入make开始编译,即可获得板端可执行程序encoder_sample:
cd ta-vsp/ta-samples/encode
mkdir build && cd build
cmake .. && make
- 通过
scp命令将程序发送到板端的/usr/data/venc目录下:
scp -r encoder_sample root@192.168.56.171:/usr/data/venc # IP 地址按照实际情况更改
- 登录到板端的
/usr/data/venc目录:
./encoder_sample -i 1920x1080_420p_10f.yuv -f yuv420p -w 1920 -h 1080 -s 1
- 编码停止后,会在当前目录下生成
1920x1080_420p_10f_yuv420p_result.h264文件,它是h264格式的文件。从日志可看到编码性能约为 34.59 fps(实际帧率受文件长度影响,用长视频文件可测得更稳定值)。
2026-04-22 10:46:26 [INFO][taffmpeg] Encoding performance: 34.59 fps
- 将生成的
.h264文件拷回主机,用ffmpeg提供的ffplay工具进行播放,观察图像正确性。播放命令为:
ffplay -f h264 1920x1080_420p_10f_yuv420p_result.h264
4.5 图像裁剪示例 (crop)
1. crop_tacv
输入说明:
- JPEG 图片:使用解码为 NV12
- H264/HEVC 视频:使用
h264_taco/hevc_taco硬件解码为 NV12
裁剪图像指定区域,输出 JPEG。
tacv_sample_crop <input_file> <out_w> <out_h> <crop_x> <crop_y> <output_file>
| 参数 | 说明 |
|---|---|
| input_file | 输入图片(jpeg) |
| out_w / out_h | 裁剪输出尺寸 |
| crop_x / crop_y | 裁剪起始坐标 |
| output_file | 输出 JPEG 文件路径 |
./tacv_sample_crop dog_bike_car_640x640.jpg 320 320 50 50 crop_out.jpg
2. crop_taopencv
输入说明:
- JPEG 图片:使用解码为 NV12
- H264/HEVC 视频:使用
h264_taco/hevc_taco硬件解码为 NV12
裁剪图像指定区域,输出 JPEG。
taopencv_sample_crop <input_file> <crop_w> <crop_h>
| 参数 | 说明 |
|---|---|
| input_file | 输入图片(jpeg) |
| crop_w / crop_h | 裁剪输出尺寸 |
./taopencv_sample_crop src_jpeg_1920x1080.jpg 1280 720
./taopencv_sample_crop output.mp4 640 360
4.6 裁剪+缩放+填充示例 (crop_and_resize_padding)
输入说明:
- JPEG 图片:使用
ta_cv_image_jpeg_dec硬件解码为 NV12 - H264/HEVC 视频:使用
h264_taco/hevc_taco硬件解码为 NV12
裁剪 + 缩放 + padding 转换,用 tacv 实现了 letterbox 算法。
tacv_sample_convert_padding <input_file> crop_to_stx crop_to_sty crop_w crop_h dst_w dst_h dst_fmt <output_file>
| 参数 | 说明 |
|---|---|
| input_file | 输入图片或视频文件 |
| crop_to_stx / crop_to_sty | 裁剪起始坐标 |
| crop_w / crop_h | 裁剪尺寸 |
| dst_w / dst_h | 目标尺寸 |
| dst_fmt | 目标格式(3=NV12, 10=RGB_PACKED, 11=BGR_PACKED) |
| output_file | 输出文件路径 |
./tacv_sample_convert_padding dog_bike_car_640x640.jpg 0 0 320 320 160 240 3 letterbox.jpg
4.7 色彩空间转换示例 (csc)
1. csc_tacv
输入说明:
- JPEG 图片:使用
ta_cv_image_jpeg_dec硬件解码为 NV12 - H264/HEVC 视频:使用
h264_taco/hevc_taco硬件解码为 NV12
展示了一个标准的前处理操作,crop ROI -> resize -> CSC 。
tacv_sample_csc <input_file> <out_w> <out_h> <crop_h> <crop_w> <output_file>
| 参数 | 说明 |
|---|---|
| input_file | 输入图片或视频文件 |
| out_w / out_h | 输出尺寸 |
| crop_w / crop_h | 裁剪尺寸 |
| output_file | 输出 RGB bin 文件路径 |
./tacv_sample_csc output.mp4 128 128 224 224 csc_output.bin
将 csc_output.bin 拷回主机,用 ffplay 工具进行播放,观察图像正确性。播放命令为:
ffplay csc_output.bin -f rawvideo -pixel_format rgb24 -video_size 128x128
2. csc_taopencv
输入说明:
- JPEG 图片:使用解码为 NV12
- H264/HEVC 视频:使用
h264_taco/hevc_taco硬件解码为 NV12
taopencv_sample_csc 图像颜色空间转换,输出 JPEG。
taopencv_sample_csc <input_file>
| 参数 | 说明 |
|---|---|
| input_file | 输入图片(jpeg) |
./taopencv_sample_csc output.mp4
./taopencv_sample_csc src_jpeg_1920x1080.jpg
4.8 HDMI 输入输出示例 (hdmi_in_out)
演示 HDMI OUT 和 HDMI IN OUT 以及 tavo 九宫格处理功能。在执行 sample 前,请先确认各项输入参数是否正确。另外测试 HDMI OUT 需要额外在 /root/ 目录下需存放 video.nv12 测试数据,可以自行替换其他测试数据。
输入说明:
- HDMI OUT: 需要
/root/video.nv12 - HDMI IN OUT: 电脑hdmi口与小板的hdmi-in口连接,转接小板的usb-a口与dk设备的usb-a口连接,dk设备的rgb接口与转接小板的rgb接口用短排线连接,转接小板的hdmi-out与显示屏连接
裁剪图像指定区域,输出 JPEG。
hdmi <function>
| 参数 | 说明 |
|---|---|
| function | 测试输出或者输入输出 |
./hdmi out
./hdmi in-out
4.9 JPEG 编解码示例 ( jpeg_dec_enc )
1. jpeg_dec_enc_taopencv
输入说明:
- JPEG 图片:使用解码为 NV12。
JPEG图像的解码及编码,输出 JPEG。
taopencv_sample_jpeg_dec_enc <input_file>
| 参数 | 说明 |
|---|---|
| input_file | 输入图片(jpeg) |
./taopencv_sample_jpeg_dec_enc src_jpeg_1920x1080.jpg
2. jpeg_dec_tacv
输入说明:
- JPEG 图片:使用
ta_cv_image_jpeg_dec硬件解码为 NV12 - H264/HEVC 视频:使用
h264_taco/hevc_taco硬件解码为 NV12
JPEG 硬件解码,输出二进制文件。
tacv_sample_jpeg_dec <jpeg_file> <width> <height> <output_file>
| 参数 | 说明 |
|---|---|
| jpeg_file | 输入 JPEG 文件 |
| width / height | 图像尺寸 |
| output_file | 输出 JPEG 文件路径 |
./tacv_sample_jpeg_dec dog_bike_car_640x640.jpg 640 640 output_dec.bin
将 output_dec.bin 拷回主机,用 ffplay 工具进行播放,观察图像正确性。播放命令为:
ffplay -f rawvideo -pixel_format nv12 -video_size 640x640 output_dec.bin
3. jpeg_enc_tacv
输入说明:
- JPEG 图片:使用
ta_cv_image_jpeg_dec硬件解码为 NV12 - H264/HEVC 视频:使用
h264_taco/hevc_taco硬件解码为 NV12
缩放图像,为了效果展示,保存成JPEG文件。
tacv_sample_jpeg_enc <input_file> <output_file>
| 参数 | 说明 |
|---|---|
| input_file | 输入图片或视频文件 |
| output_file | 输出 JPEG 文件路径 |
./tacv_sample_jpeg_enc dog_bike_car_640x640.jpg jpeg_enc_output.jpg
4.10 OpenCV Mat 转 AVFrame 示例 (mat_to_avframe)
输入说明:
- H264/HEVC 视频:使用
h264_taco/hevc_taco硬件解码为 NV12。
由 AVFrame 构造的 Mat 对象,并进行格式转换操作。
taopencv_sample_mat_to_avframe <input_file>
| 参数 | 说明 |
|---|---|
| input_file | 输入视频流(MP4) |
./taopencv_sample_mat_to_avframe output.mp4
将 load_avframe.nv12 拷回主机,用 ffplay 工具进行播放,观察图像正确性。播放命令为:
ffplay load_avframe.nv12 -f rawvideo -pixel_format nv12 -video_size 640x360
4.11 多目标跟踪示例 (mot)
属于 pipeline类型的 demo,其中包含解码、图像处理、模型处理、编码、后处理等模块。
- 在 docker 中,执行以下命令:
cd /tps-future/ta-vsp/ta-samples/mot/simple_demo
mkdir build && cd build
cmake .. && make
- 运行
执行完编译操作盒,可以获得可执行文件 simple_demo 。在板端运行还需要准备模型文件、config 文件以及数据文件,我们可以通过 scp 命令将文件拷贝到板端。
运行命令:
./simple_demo config.json
注意:
- config.json 为配置文件,请根据实际情况进行修改。
- conifg.json 中的模型文件路径或者数据文件路径为板端的路径,请根据实际情况进行修改。
- 通过修改 config.json 可以设置 opencv 解码或者 ffmpeg 解码
- 修改 config.json 中的 output 字段可以保存输出视频为 mp4 文件
4.12 图像缩放示例 ( resize )
1. resize_tacv
缩放图像,为了效果展示,保存成 JPEG 文件。
tacv_sample_resize <input_file> <out_w> <out_h> <output_file>
| 参数 | 说明 |
|---|---|
| input_file | 输入图片或视频文件 |
| out_w / out_h | 缩放输出尺寸 |
| output_file | 输出 JPEG 文件路径 |
./tacv_sample_resize dog_bike_car_640x640.jpg 320 320 resize_output.jpg
2. resize_taopencv
图像缩小,输出 JPEG。
taopencv_sample_resize <input_file> <out_width> <out_height>
| 参数 | 说明 |
|---|---|
| input_file | 输入图片(jpeg) |
| out_width / out_height | resize 输出尺寸 |
./taopencv_sample_resize src_jpeg_1920x1080.jpg 360 640
./taopencv_sample_resize output.mp4 360 640
4.13 图像拼接示例 (stitch)
实现四宫格 sample,注意这里是采取了一个输入复制了多份,然后拼接到目标画布,NV12 输出为 JPEG,并将效果图编码成了 JPEG 文件。
tacv_sample_stitch <input_file> <output_file>
| 参数 | 说明 |
|---|---|
| input_file | 输入图片或视频文件 |
| output_file | 输出文件路径 |
./tacv_sample_stitch dog_bike_car_640x640.jpg stitch_out.jpg
五、Model Zoo
5.1 Model Zoo 简介
Model Zoo 是特普斯微官方提供的一系列预训练、预优化的高性能 AI 模型集合,专为 EA65 系列 AI SoC 设计。它旨在帮助开发者最大限度地缩短开发周期,并确保在硬件上获得最佳性能。
每个模型包通常包含:
- 预优化模型文件: 直接在 NPU 上运行的
.nb格式量化模型。 - 端到端示例代码: 覆盖模型从数据读入到后处理全过程的例程。
- 自定义转换工具: 支持使用自有数据集进行模型量化或微调。
- 性能与精度报告: 提供在目标硬件上的实测数据供开发者评估。
5.2 Model Zoo 运行示例
本例程基于官方 YOLO11 模型,经过优化和适配,可在 EM20-DK 硬件平台上高效运行,用于实现对 80 种常见物体的实时检测。本例程提供的预编译模型为 INT8 量化模型(.nb 格式),旨在平衡检测精度与推理速度。项目代码通过 taRuntime 加载并执行 .nb 模型,利用 OpenCV 进行图像的预处理和后处理。
5.2.1 测试环境准备
准备一台 PC 作为 host 机,并配备 Ubuntu 系统和 Python 环境。EM20-DK 平台作为 device 机,已预装 Ubuntu 系统和 SDK。
访问 Model Zoo 官方 Gitee 或 Model Zoo 官方 Github,下载官方提供的算法示例。
以 YOLO11 模型为例,通过运行 samples/YOLO11_det/scripts/ 目录下的 download.sh 脚本,获取例程所需的模型、数据与脚本等内容。
chmod +x download.sh && ./download.sh
下载内容:
models/
├── datasets.txt
├── yolo11s_float16.nb
├── yolo11s.onnx
├── yolo11s_int8.nb
├── yolo11s_config_fp16.json
└── yolo11s_config_int8.json
test_images/ # 测试用图片
├── input1.jpg
├── input2.jpg
├── input3.jpg
├── input4.jpg
└── input5.jpg
datasets/
├── val2017_1000 # coco val2017中随机抽取的1000张样本
└── instances_val2017_1000.json # coco val2017中随机抽取的1000张样本对应的标注信息
通过 TACO SDK 搭建交叉编译环境,使用交叉编译工具链编译生成可执行文件 yolo11s_det_soc:
cd cpp
mkdir build && cd build
cmake ..
make
在 EM20-DK 板端新建模型文件夹 yolo11,并通过 scp 命令将数据从 host 机复制到该目录下,复制完成后 yolo11 目录结构如下:
yolo11
├── test_images # 测试集图片
│ ├── input1.jpg
├── models
│ └── yolo11s_int8.nb # .nb 模型
| └── yolo11s_float16.nb
└── yolo11s_det_soc # 例程程序
5.2.2 单图推理
YOLO11s INT8 模型
在 yolo11 目录下运行 INT8 模型:
root@em20-dk:~/yolo11# ./yolo11s_det_soc --input=test_images/input1.jpg --model=models/yolo11s_int8.nb
--------------------------------------
Single Image Inference Mode
Model: models/yolo11s_int8.nb
Input: test_images/input1.jpg
Output: output.jpg
Conf thresh: 0.25
NMS thresh: 0.45
--------------------------------------
Input num: 1, Output num: 3
--------------------------------------------------------------
Tensor Attribute index: | 0
dim_count: | 4
dim_size: | [640, 640, 3, 1]
data_format: | 3
quant_format: | 2
quant_data (dfp):
fixed_point_pos: | 998277230
quant_data (affine):
tf_scale: | 0.003922
tf_zero_point: | -128
name: | uid_30000_out_0
--------------------------------------------------------------
--------------------------------------------------------------
Tensor Attribute index: | 0
dim_count: | 3
dim_size: | [6400, 144, 1]
data_format: | 3
quant_format: | 2
quant_data (dfp):
fixed_point_pos: | 1044353412
quant_data (affine):
tf_scale: | 0.187079
tf_zero_point: | 23
name: | uid_30001_out_0
--------------------------------------------------------------
--------------------------------------------------------------
Tensor Attribute index: | 1
dim_count: | 3
dim_size: | [1600, 144, 1]
data_format: | 3
quant_format: | 2
quant_data (dfp):
fixed_point_pos: | 1048615530
quant_data (affine):
tf_scale: | 0.251178
tf_zero_point: | 66
name: | uid_30002_out_0
--------------------------------------------------------------
--------------------------------------------------------------
Tensor Attribute index: | 2
dim_count: | 3
dim_size: | [400, 144, 1]
data_format: | 3
quant_format: | 2
quant_data (dfp):
fixed_point_pos: | 1046139268
quant_data (affine):
tf_scale: | 0.213691
tf_zero_point: | 70
name: | uid_30003_out_0
--------------------------------------------------------------
Model initialized successfully
--------------------------------------
Detected 16 objects
===== Time Statistics =====
Image read time: 113.72 ms
Preprocess time: 89.49 ms
Inference time: 15.48 ms
Postprocess time: 57.66 ms
Total time: 276.36 ms
============================
Output saved to: output.jpg
--------------------------------------
Model deinitialized
输出日志解析:
- 使用模型:models/yolo11s_int8.nb
- 输入图像:test_images/input1.jpg(input1.jpg 可换成自定义 jpg 文件)
- 输出图像:output.jpg
- 输入图像的尺寸:640x640 像素(预处理后)
- 性能统计:
- 读图+解码: 113.72 ms,占比 44.19%
- 预处理:89.49 ms,占比 33.05%
- npu推理:15.48 ms,占比 5.07%
- 后处理:57.66 ms,占比 20.05%
- 总耗时:276.36 ms
- 检测结果:共 16 个对象,置信度 ≥ 0.25
- Inference FPS:≈ 64.6 fps(1000/15.48)
- 端到端 FPS:≈ 3.6 fps(1000/276)
- 状态:PASS
生成结果
YOLO11s FP16 模型
在 yolo11 目录下运行 FP16 模型:
root@em20-dk:~/yolo11# ./yolo11s_det_soc --input=test_images/input1.jpg --model=models/yolo11s_float16.nb
--------------------------------------
Single Image Inference Mode
Model: models/yolo11s_float16.nb
Input: test_images/input1.jpg
Output: output.jpg
Conf thresh: 0.25
NMS thresh: 0.45
--------------------------------------
Input num: 1, Output num: 3
--------------------------------------------------------------
Tensor Attribute index: | 0
dim_count: | 4
dim_size: | [640, 640, 3, 1]
data_format: | 1
quant_format: | 0
quant_data (dfp):
fixed_point_pos: | 0
quant_data (affine):
tf_scale: | 0.000000
tf_zero_point: | 0
name: | input/output[0]
--------------------------------------------------------------
--------------------------------------------------------------
Tensor Attribute index: | 0
dim_count: | 3
dim_size: | [6400, 144, 1]
data_format: | 1
quant_format: | 0
quant_data (dfp):
fixed_point_pos: | 0
quant_data (affine):
tf_scale: | 0.000000
tf_zero_point: | 0
name: | uid_5_out_0
--------------------------------------------------------------
--------------------------------------------------------------
Tensor Attribute index: | 1
dim_count: | 3
dim_size: | [1600, 144, 1]
data_format: | 1
quant_format: | 0
quant_data (dfp):
fixed_point_pos: | 0
quant_data (affine):
tf_scale: | 0.000000
tf_zero_point: | 0
name: | uid_4_out_0
--------------------------------------------------------------
--------------------------------------------------------------
Tensor Attribute index: | 2
dim_count: | 3
dim_size: | [400, 144, 1]
data_format: | 1
quant_format: | 0
quant_data (dfp):
fixed_point_pos: | 0
quant_data (affine):
tf_scale: | 0.000000
tf_zero_point: | 0
name: | uid_3_out_0
--------------------------------------------------------------
Model initialized successfully
--------------------------------------
Detected 16 objects
===== Time Statistics =====
Image read time: 90.98 ms
Preprocess time: 44.19 ms
Inference time: 24.61 ms
Postprocess time: 51.13 ms
Total time: 210.91 ms
============================
Output saved to: output.jpg
--------------------------------------
Model deinitialized
输出日志解析:
- 使用模型:models/yolo11_float16.nb
- 输入图像:test_images/input1.jpg(input1.jpg 可换成自定义 jpg 文件)
- 输出图像:output.jpg
- 输入图像的尺寸:640x640 像素 (预处理缩放后)
- 性能统计:
- 读图+解码:90.98 ms,占比 44.19%
- 预处理:44.19 ms,占比 44.19%
- npu推理:24.61 ms,占比 24.61%
- 后处理:51.13 ms,占比 51.13%
- 总耗时:210.91 ms
- 检测结果:共 16 个对象(置信度 ≥ 0.25)
- Inference FPS:≈ 40.7 fps(1000/24.61)
- 端到端FPS:≈ 40.7 fps
- 状态:pass
生成结果
5.2.3 模型性能评测
基于单图推理测试结果,我们进行了性能对比分析:
性能对比表格
| 模型名称 | 输入图像 | 输出图像 | 读码解码时间(ms) | 预处理时间(ms) | NPU推理时间(ms) | 后处理时间(ms) | 总耗时(ms) | 推理FPS | 端到端FPS |
|---|---|---|---|---|---|---|---|---|---|
| YOLO11s INT8 | input1.jpg | output.jpg | 113.72 | 89.49 | 15.48 | 57.66 | 276.36 | 64.6 | 3.6 |
| YOLO11s FP16 | input1.jpg | output.jpg | 90.98 | 44.19 | 24.61 | 51.13 | 210.91 | 40.6 | 4.7 |
性能分析
- NPU 推理性能:INT8 模型推理耗时仅 15.48 ms,相比 FP16 模型的 24.61 ms 提升了约 59%,INT8 量化在 NPU 上优势明显。
- 端到端性能:尽管 INT8 推理更快,但整体端到端耗时(276.36 ms)反而高于 FP16(210.91 ms),主要原因是 INT8 版本在图像读码解码和预处理阶段耗时较多(合计 203.21 ms,占 73.5%)。这使得 FP16 的端到端 FPS(4.7 fps)反而高于 INT8(3.6 fps)。
- 瓶颈定位:无论 INT8 还是 FP16,前后处理时间占总耗时的 80% 以上(INT8 为 88%,FP16 为 80%),说明当前 pipeline 的瓶颈在于图像读码、预处理和后处理阶段。后续优化应聚焦于 DMA-BUF 零拷贝、多线程流水线以及降低输入分辨率等方法,以进一步提升端到端性能。
结论
- INT8 量化在 NPU 推理速度上具有显著优势(+59%),适合对单帧推理延迟敏感的应用。
- 端到端整体性能受前后处理制约较大,FP16 模型因预处理时间更短而获得更高的整体帧率。
- 后续工作需重点优化数据流 pipeline,以充分发挥 NPU 的算力潜力。
5.3 获取更多模型
Model Zoo 将持续扩充,涵盖更多 AI 应用领域,致力于提供“拿来即用”的 AI 模型解决方案,成为用户开发 AI 应用的强大助力。